/**
 * 给定整数K，再给定一个长度为N的数组C，要求从中挑出一个子序列满足：
 *  1. 长度是K的整数倍
 *  2. 每K个数相等
 *  3. 长度最长
 * 问满足条件的子序列的数量
 * 由于N在100，因此可以做到O(N^3)
 * 令 Dij 是长度为i以j结尾的方案总数, 则
 * 如果 i - 1 是K的倍数，则 Dij 之前所有 D[i-1] 之和
 * 否则， Dij 是之前所有 D[i-1][k] 且 Ck==Cj 之和
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
llt const MOD = 1E9 + 7;

int N, K;
vector<int> C;

llt proc(){
    /// dij表示位置j结尾且长度为i的合法序列的方案总数
    vector<vector<llt>> d(N + 1, vector<llt>(N + 1, -1LL));

    
    d[0][0] = 1;
    for(int i=0;i<N;++i){
        for(int j=i;j<=N;++j){
            if(-1 == d[i][j]) continue;
            if(i % K == 0){ // 开始新的分段
                for(int k=j+1;k<=N;++k){
                    if(-1 == d[i + 1][k]) d[i + 1][k] = d[i][j];
                    else (d[i + 1][k] += d[i][j]) %= MOD;
                }
            }else{
                for(int k=j+1;k<=N;++k){
                    if(C[k - 1] == C[j - 1]){
                        if(-1 == d[i + 1][k]) d[i + 1][k] = d[i][j];
                        else (d[i + 1][k] += d[i][j]) %= MOD;
                    }
                }
            }
        }
    }
    
    llt ans = 0;
    for(int i=N/K*K;i>=0;i-=K){
        llt tmp = -1LL;
        for(int j=i;j<=N;++j){
            if(-1 != d[i][j]){
                if(-1 == tmp) tmp = d[i][j];
                else (tmp += d[i][j]) %= MOD;
            }
        }
        if(-1 != tmp) {ans = tmp;break;}
    }
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase; cin >> nofkase;
    while(nofkase--){
        cin >> N >> K;
        C.assign(N, 0);
        for(auto & i : C) cin >> i;
        cout << proc() << endl;
    }
    return 0;
}